92343 - 양과 늑대
정보
- 문제 보기: 92343 - 양과 늑대
- 소요 시간: 💥1시간 초과
- 풀이 언어:
java - 체감 난이도: 3️⃣~4️⃣ (3.8)
- 리뷰 횟수: ✅
풀이 키워드
스포주의
백트래킹 비트마스킹
풀이 코드
정보
- 메모리: 90500 KB
- 시간: 3 ms
import java.util.*;
class Solution {
List<Integer> ansList;
int[][] _edges;
int[] _info;
boolean[] visited;
public void dfs(int sheep, int wolf) {
if (sheep > wolf) ansList.add(sheep);
else return; // base case
for (int[] e : _edges) {
if (visited[e[0]] && !visited[e[1]]) {
visited[e[1]] = true;
if (_info[e[1]] == 0) dfs(sheep+1, wolf); // 가려는 곳이 양
else dfs(sheep, wolf+1); // 가려는 곳이 늑대
visited[e[1]] = false;
}
}
}
public int solution(int[] info, int[][] edges) {
_edges = edges;
_info = info;
ansList = new ArrayList<>();
visited = new boolean[info.length];
Arrays.fill(visited, false);
visited[0] = true;
dfs(1, 0);
return Collections.max(ansList);
}
}
풀이 해설
상태공간 트리를 dfs로 탐색하는 백트래킹 문제이다. (물론 bfs도 가능한데, dfs가 편함.)
각 간선 e = (s, t)를 순회하며 방문한 정점 s로부터 방문하지 않은 정점 t로 재귀 호출하여 경우의 수를 탐색한다.
다시 말해, 현재 방문한 정점들로 구성되는 그래프로부터, 점점 영역 확장을 시도하는 것이다.